home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / PROGTOOL / SHRDIT.ZIP;1 / SHROUDIT.DOC < prev    next >
Encoding:
Text File  |  1994-04-23  |  36.9 KB  |  846 lines

  1.                 S h r o u d I t !   U S E R S   G U I D E
  2.                 =========================================
  3.  
  4.        Table of Contents
  5.  
  6.                 1     Introduction
  7.  
  8.                 2     ShroudIt! Features
  9.  
  10.                 3     Technical Overview
  11.  
  12.                 4     Setting up
  13.  
  14.                 5     Control parameters
  15.  
  16.                 6     Command line
  17.  
  18.                 7     Cross-reference Map
  19.  
  20.                 8     Technical Support
  21.  
  22.                 9     Appendix
  23.  
  24.                       Error codes
  25.                       License & Warranty
  26.                       Ordering
  27.  
  28. Introduction:
  29. -------------
  30.  
  31. ShroudIt! is designed to be used whenever you are concerned that the
  32. security of your original work could be compromised or you want to
  33. protect your intellectual property.  ShroudIt! uses a patent pending
  34. rule based system implemented in Prolog that allows you to obfuscate
  35. practically any part of your original work.  The obfuscation changes
  36. your original so that a human reader is unable to discern the sense or
  37. meaning, but the computer interprets it EXACTLY equivalent to the
  38. original.
  39.  
  40. All the features and techniques are controlled by externally definable
  41. rules, so the entire process can be tailored to a specific target
  42. source language of your choice.  Of course we cannot guarantee that
  43. ShroudIt! will work with absolutely any source, but with careful tuning
  44. it should cover most of the major language systems in use today.
  45.  
  46. The degree of obfuscation consists of three distinct levels.  At the
  47. base level the core scrambling is achieved by replacing all variables by
  48. meaningless random strings instead.  Additionally any text inside
  49. comments is discarded. This level of obfuscation will work with almost
  50. any language.
  51.  
  52. The next level allows you to expand any copy book or included source code
  53. in-line into the main source body.  In addition you can replace any
  54. numeric or string constants with tokens instead.  This is done by
  55. declaring the tokens to be equivalent to the number or text, and the
  56. text can be optionally written as raw ASCII codes if the target language
  57. supports this.
  58.  
  59. The final level both compresses the source and replaces keywords with
  60. random tokens.  Again this is only possible where the target language
  61. syntax is not dependent on line numbers and white space (or end of line)
  62. significance, and has some kind of macro or pre-processor facility.
  63.  
  64. You can use the INTRO program provided to review an example of each
  65. level when used against a small sample 'C' language source program.
  66.  
  67. The key to successfully using ShroudIt! is to customize the rule set
  68. to match your requirements.  Several examples are provided for you to
  69. work from.  The strength in this method is that you can set ShroudIt! to
  70. skip over any special language extensions such as embedded SQL, or key
  71. external routines with specific syntax.  Of course you may conclude that
  72. this would limit the level of obscuring in the process, but there is
  73. nothing to stop you not only obscuring your source code, but also your
  74. database tables as well!
  75.  
  76. Once you deploy your secured system, ShroudIt! provides you with MAP
  77. files which cross reference between the original source and the
  78. obfucated text.  These facilitate providing debugging and support for
  79. the deployed system.
  80.  
  81. As with any process you need to determine a balance between your
  82. business goals and technical needs.  ShroudIt! provides a tool which
  83. gives you more options in achieving that balance.
  84.  
  85. Some extra business support functions that ShroudIt! includes are
  86. automatic prefixing of copyright notices to source, along with copy
  87. branding.  The branding works by automatically generating a serial
  88. number using a hash scheme.  You provide the name of the end user and
  89. this is hashed to produce a serial number.  This serial number is then
  90. used to seed the random number generator.  Doing this means each
  91. resultant source output is uniquely identifiable, even if your original
  92. files are tampered with or incorporated into other source.
  93.  
  94. The following section summarizes the feature set that ShroudIt! provides.
  95.  
  96.  
  97. ShroudIt! Features:
  98. -------------------
  99.  
  100. ShroudIt! features can be divided into three distinct levels.  Each
  101. level is shown, first with the key functions performed, then followed by
  102. the main components that allow this, and after that special control
  103. parameters that specify the exact details.
  104.  
  105. Level One - (base level)
  106.  
  107. - Variable name substitution and comment stripping
  108.  
  109. - Components
  110.     Language key words dynamically definable
  111.     External and global function key words dynamically definable
  112.     Comment syntax dynamically definable
  113.  
  114. - Parameters
  115.        Regular line, complex nested, or simple block comments
  116.        Compiler directives handling
  117.        Minimum length for random names
  118.        Join character for name tokens
  119.        Repeated use of name across code blocks obfuscation
  120.        Code block delimiter tokens
  121.        Registration and serial number branding
  122.        Random number seeding control
  123.        Duplicate token name checking
  124.        String text delimiters
  125.        Continuation line syntax
  126.  
  127. Level Two - (extended level)
  128.  
  129. - Include file expansion, number and string constant replacement. (Supports
  130.                                use of includes within includes to any depth).
  131.  
  132. - Components
  133.     Include or copy book language syntax definition
  134.     Language syntax for replacing numbers and strings
  135.  
  136. - Parameters
  137.        Supports compiler environment variables for include file paths
  138.        Optionally exclude certain system includes or copy books
  139.        Language syntax for ASCII code substitution
  140.  
  141. Level Three - (maximum level)
  142.  
  143. - Source compression and language keyword substitution
  144.  
  145. - Components
  146.     Language key words dynamically definable
  147.     External function key words dynamically definable
  148.     Include or copy book language syntax definition
  149.  
  150. - Parameters
  151.        Compression line length
  152.        Compression exclusions
  153.        Continuation line syntax
  154.        Randomly generated replacement names
  155.        Occasional special token replacement
  156.  
  157. Finally as needed you can use the in-line &&ShroudIt! parameter to pass
  158. on the fly instructions to the shrouder at critical points within a
  159. particular source file.  These override the default values specified by
  160. the parameter rules.
  161.  
  162. History:
  163. --------
  164.  
  165. As a company we develop custom AI and Image Processing solutions and
  166. integrate them into traditional application systems.
  167.  
  168. ShroudIt! was developed to protect our own source code library on a Sun
  169. UNIX system for a CNAPS massively parallel processor.  The CNAPS has its
  170. own unique dialect of C and as yet no object linking capability.  Our
  171. patent pending LNK_ImageLib graphical image processing product used in
  172. combination with the CNAPS processor gives a stunning improvement to
  173. automated satellite imagery processing.  What used to take 8 hours to do
  174. on a high end RISC workstation, can now be done in real time in under 3
  175. minutes.  We would be happy to discuss any image processing needs you
  176. have too.
  177.  
  178. As an example of our confidence in ShroudIt!, you can find the
  179. obfuscated Prolog source code included along with the other system
  180. files.
  181.  
  182. Just a reminder that our licensing terms allow you to work with
  183. ShroudIt! free of charge for up to 60 days.  However, at the moment that
  184. you distribute product created using ShroudIt! you must have purchased
  185. an applicable license from LNK Corporation, Inc.  See ordering details
  186. in the ORDER file accompanying this document, and in the Appendix also.
  187.  
  188.  
  189. Technical Overview:
  190. -------------------
  191.  
  192. ShroudIt! allows you to distribute program source code so that it can
  193. be compiled, but not re-engineered.  The code itself is masked to
  194. obscure the content from the human reader, while allowing a compiler to
  195. re-produce the exact equivalent executable to the original source.
  196.  
  197. This product is designed to work with various 3GL block structured
  198. languages.  It has been tried with C, Pascal, Basic, dBase, Prolog, Perl
  199. and COBOL.  In addition it should work for C++, Ada, PL/1, and others
  200. too.
  201.  
  202. Note: You must ensure all code clean compiles with the native compiler
  203. BEFORE attempting to use ShroudIt! on that source.
  204.  
  205. The design allows you to specify the language key words and global
  206. functions, and also to set various control parameters specific to
  207. the program you wish to obfuscate.
  208.  
  209. Sets of key words are provided as examples.  (You must produce your own
  210. specific to the particular source code and compiler you are using).
  211.  
  212. A shrouded word map cross-reference is produced, along with line numbers.
  213. This allows you to support your code when users report bugs. You should
  214. NEVER provide your end-users with this map!
  215.  
  216. Always check the MAP to make sure no language key words have been overlooked
  217. from the .KEY parameter file.  (If your compile fails on an undefined word
  218. this is the first thing you should check).
  219.  
  220. You can optionally provide a copyright notice to be prefixed to your code.
  221.  
  222. Also, the shrouder can use a hash count from a company name string to seed the
  223. random number generator.  This means each copy can be custom produced with
  224. a serial number, and will be unique to each customer.
  225.  
  226.  
  227. Setting up:
  228. -----------
  229.  
  230. Shrouder will run in two modes, interactive, or batch.  The -b command
  231. line parameter forces batch mode processing.
  232.  
  233. Shrouder expects its control files to be called "sh-xxxxx.ttt", where xxxxx
  234. is the name of the language you are using. 'ttt' is an extension depending
  235. on the type of information in the control file. I.e.
  236.  
  237.   ctl - control parameters that control execution.
  238.   key - language key word list
  239.  
  240.   glb - optional, global names that should not be obfuscated, or exact
  241.         obfuscated name for global names.
  242.  
  243.   inc - optional, include files to be EXCLUDED from in-line expansion into
  244.         source.
  245.   obs - optional, obscure list, useful for generic variables like i,j,k, etc.
  246.   cpy - optional, copyright notice, will prefix all output files.
  247.   dir - optional, compiler directives to be scanned as is.
  248.  
  249. You can therefore create different sets of files in different directories
  250. to tailor the shrouding required for each set of code files.  (You can also
  251. embed inline control parameters in the code.  To do this place an &&ShroudIt!
  252. token immediately before the actual parameter, and make the line a comment).
  253.  
  254. ShroudIt! searches for control files in the following places, the location
  255. of the input source code; the current directory; the executable location.
  256. This allows you to place control files to override the default set as
  257. you need.
  258.  
  259. You will notice that the supplied key word and global lists contain only
  260. single columns.  If you add a second column, separated by a comma,
  261. shrouding will use the word in the second column as the replacement
  262. token.  This is useful for global functions that you wish to obscure,
  263. but must be consistently named.  (When loading keywords or globals
  264. ShroudIt! ignores subsequent duplicate entries in your list).
  265.  
  266. Optionally you can set the DEFINE GLOBLS switch in the control file,
  267. then the program will automatically assign DEFINE statements for these
  268. globals along with a randomly generated name.  The same can be done for
  269. language keywords if the language supports such substitutions.  (See
  270. notes below for further ideas).  Note that the program scans for
  271. duplicate entries while loading these parameters and ignores subsequent
  272. entries for the same key word or global.  Key words are loaded first.
  273.  
  274. These substitutions will be written to an include file.  The include
  275. file is given the file extension .SHR, and the name from the output file
  276. specified.  You can also direct that numeric or string constants be
  277. defined into the include file, and replaced in the original code by a
  278. random token instead.
  279.  
  280. Control parameters:
  281. -------------------
  282.  
  283. Each line in the control file sets a particular parameter.
  284. The basic format is: CODE WORD: Value1,Value2
  285.  
  286. Value2 is optional.
  287.  
  288. Those familiar with C and Pascal will recognise various language
  289. characteristics. A "%" in the first column indicates a text comment.
  290.  
  291. Below is a sample of control parameters for C language shrouding.
  292.  
  293. % These parameters control string processing
  294. STRING: ","
  295. CHAR: ','
  296. SPECIAL CHAR: \
  297.  
  298. % These parameters control name substitutions
  299. NAME JOINS: _
  300. KEEP LENGTH: No,6
  301. KEEP SEPARATORS: Yes
  302. CASE SENSITIVE: Yes
  303. KEEP CASE: Yes
  304. MAX LENGTH: 31
  305. DUP CHECK: 5
  306.  
  307. % Comment delimiters
  308. LINE COMMENT: //
  309. COMMENT: /*,*/
  310. NESTED: No
  311. OUT COMMENT: /*,*/
  312.  
  313. % Include file handling
  314. INCLUDING: #include,<>
  315. INCLUDING: #include,""
  316. SKIP INCLUDE: <>
  317. REPLACE NUMBS: #define  ,
  318. REPLACE STRGS: No
  319. STRING TO HEX: No
  320.  
  321. % Random name generation and miscellaneous
  322. SEED RANDOM: Yes
  323. COMPRESS LINE: Yes,70
  324. COMPRESS SKIP: #define
  325. REGISTRATION: R&D,, LNK Corporation, Inc, Riverdale, MD.
  326. SERIAL NUMBER: L01-,IL-1
  327. OBSCURE NAMES: Yes
  328. BLOCK TOKENS: {,}
  329. DEFINE GLOBLS: Yes
  330. DEFINE KEYWRD: Yes
  331. DEFINE REPLACE: }, $_
  332. DEFINE REPLACE: ), x_Rqz
  333.  
  334. The random seed should be set off if you want SHROUDER to generate exactly
  335. the same names each time.  This is useful when you are de-bugging code
  336. changes, and you need to compare the output from two different runs.
  337.  
  338. Obscuring names:
  339. ----------------
  340.  
  341. This feature is designed to mask your use of common variable names such
  342. as i,j,k, etc, across all of your code.  Use "OBSCURE NAMES: No" if you
  343. want to disable this feature.  Otherwise, provide the block START and
  344. END delimiters.  (For Prolog these would be : and ., for Pascal they
  345. would be BEGIN and END) You then also need to list variables in the .OBS
  346. control file.  Processing will then replace these variables uniquely
  347. within each new block of code.  So if you habitually use i, j, and k for
  348. integer loop counters, you can obscure this by making them different
  349. within each new code block.  Of course, you should also use the "KEEP
  350. LENGTH" option to ensure unique names.
  351.  
  352. Keep Length:
  353. ------------
  354.  
  355. If this parameter is set on, then you must supply a length.  This is a
  356. minimum length.  Any variable names less than this length will be expanded
  357. to be this number of characters long.  Any longer names will be unchanged.
  358.  
  359. Command line:
  360. -------------
  361.  
  362. The format is:
  363.  
  364. SHROUDER  Infile  Outfile  Language [-b]
  365.  
  366. or
  367.  
  368. SHROUDER  Infile  OutMask  Language [-b]
  369.  
  370. Provide the mask in the format *.ttt, where ttt is the extension you
  371. want. The * will be replaced with the name of the input file. This makes
  372. batch file runs for SHROUDER easier to write.
  373.  
  374. The optional -b parameter suppresses the interactive display so only the
  375. batch messages are produced.
  376.  
  377. Include file processing supports use of environment variables to
  378. specify search paths. The default is the INCLUDE environment variable.
  379. You may also use SHROUD environment to point to another variable, which
  380. itself contains a valid path. I.e set TEMP=c:\dos;c:\temp;c:\include  and
  381. set SHROUD=TEMP which will allow ShroudIt to find includes pointed to by
  382. the TEMP path.
  383.  
  384. Notes:
  385. ------
  386.  
  387. - Program does not handle "/* */", i.e. comments within a string.
  388.   This is a design decision, since such a combination is rare.
  389.   If you must have these, manually change the /* */ to something else
  390.   before shrouding, and switch them back after. If shrouding fails with
  391.   only part of the original source written, you should check for this
  392.   problem.  Also line comments contained in text string delimiters without
  393.   a matching terminator can also cause problems. I.e. " //
  394.   or // ' on a line without the second delimiter.
  395.  
  396. - Comment checking assumes a space after the comment symbol, so if comments
  397.   are retained in the obfuscated code, adjust the comment in the original
  398.   by adding a space accordingly. I.e. //This comment, becomes // This comment.
  399.  
  400. - String delimiters within comments, such as ' or " can sometimes cause
  401.   miss matching in string handling.  You will notice that parts of the
  402.   code are not obscured, and string text is.  Correct your source code
  403.   by removing ' or " from within your comment.
  404.  
  405. - Duplicate word check is done for names less than the default length.
  406.   This means that there is a finite chance that some words
  407.   could collide with language keywords or other variables.  If you
  408.   suspect this, just re-run the shrouding again, after altering the
  409.   duplicate check parameter in the CTL file.
  410.  
  411. - Case sensitivity - sometimes the Shrouding can be more rigorous on this
  412.   than the compiler - foreinstance some Prologs will accept KeyWord and
  413.   Keyword as the same token, since the case sensitivity is triggered off
  414.   only the first letter (constants start with lowercase).  This is easily
  415.   corrected by setting the CASE SENSITIVE:  No, which will treat all tokens
  416.   as upper case.  Alternatively, you can also just spell tokens exactly
  417.   the same where necessary. I.e. change Keyword to KeyWord, and so on.
  418.   In function declarations it gets crazier as string and STRING are
  419.   treated the same.  To get around this manually specify a shrouded name
  420.   in the KEY word file. i.e.
  421.   STRING,RRYUQW
  422.   string,RRYUQW
  423.   Turbo Pascal and BASIC also play this same game!  (Setting CASE SENSITIVE
  424.   to No for BASIC makes sense, since most people usually code key words
  425.   as caps).
  426.  
  427. - Dbase and xBase programs - calls to external programs use the OS code
  428.   file name as a cue.  Therefore you need to put the list of such globals
  429.   in the global control file.  An easy way to do this is to use the DOS
  430.   command ==> dir *.prg > mylist   Then cut and paste the list using an
  431.   editor.  To add further confusion you may want to create random names
  432.   for these files, and then create a batch file to rename the program
  433.   files themselves.  (This is best done in a separate directory which is
  434.   used for shrouding only!)
  435.  
  436. - For C code that uses #ifdef #endif blocks which select different #includes,
  437.   you can simulate that this by putting the names of includes NOT to use
  438.   in the exclude include list.  You can then have different sets of these
  439.   control files to match your ifdef settings. I.e SH-DOS.INC and SH-UNIX.INC,
  440.   and so on.
  441.  
  442. - C style <> include files will be automatically excluded, i.e. <string.h>,
  443.   and so on. This reduces the control file setup needed to handle C include
  444.   files. This behavior is controlled by the SKIP INCLUDE setting.
  445.  
  446. - dBase style includes which are actually called programs - there are
  447.   no name delimiters such as " or < >, so you need only specify a default
  448.   extension (such as .PRG) to cause the called program to be included.
  449.  
  450. - Compression - when using compression you can control when compression
  451.   starts i.e. don't compress until "void main" is reached, or optionally
  452.   skip compressing for every line with a particular keyword on it, such
  453.   as #define, or #undef.  However you can only use compression for
  454.   languages that ignore white space such as C, and not with COBOL, etc.
  455.   Use the LINE CONTINUE parameter to suppress compression for lines with
  456.   continuation characters on them.
  457.  
  458. - PERL - there are three parameters specific to this language.  PERL
  459.   allows use of strings and function parameters very differently to
  460.   other languages.  ShroudIt! reverts to only obfuscating words proceeded
  461.   by the specified NAME TOKENs.  It also looks inside strings for variable
  462.   names (normally the reverse is true). LABELS for the NEXT statement
  463.   should be obscured using the .GLB file, and specifying your own replacement
  464.   name.  Care should be taken to choose labels that DO NOT conflict with
  465.   system variables such as FILE, DIR; i.e. Use FILEL: as label in your code.
  466.  
  467.  
  468. Parameter Format:
  469. =================
  470.  
  471. TOKEN: [Parm],[Parm]
  472.  
  473. Where token is the keyword for the parameter, followed by a :, and Parm is
  474. either Yes/No, or two values associated with the parameter.
  475.  
  476. Parameter Descriptions:
  477. =======================
  478.  
  479. STRING: ","        ---  Start and end delimiters for string substitutions.
  480. CHAR: ','          ---  Start and end delimiters for single char substitutions.
  481. SPECIAL CHAR: \    ---  Escape character used for special char in string.
  482.  
  483. NAME JOINS: _      ---  Char used for joining variables names.
  484. KEEP LENGTH: No,6  ---  Variables with names less than 6 bytes, expanded to 6.
  485.              Yes   ---  Length of names of variables is not changed.
  486. CASE SENSITIVE: No   --- When set to No, program treats all tokens as uppercase
  487.                          when doing key word and global comparisons.
  488.                          Tokens are written to .MAP cross ref' as uppercase.
  489.                 Yes  --- Default setting - program is case sensitive.
  490. KEEP SEPARATORS: Yes --- Not implemented, intended to allow shuffling of names.
  491. KEEP CASE: Yes       --- Not implemented, program follows case as written.
  492. MAX LENGTH: 31       --- Not implemented, program follows max length as written.
  493. DUP CHECK: 5       ---  Controls length at which duplicate name checking done.
  494.  
  495. LINE COMMENT: //   ---  Characters that signal rest of line is a comment.
  496. LINE COMMENT: *,6  ---  As above, except that second parm is number, look
  497.                         only at this column within the line.  This then
  498.                         means COBOL style line comments will work.
  499. COMMENT: /*,*/     ---  Characters that signal start of comment block.
  500. NESTED: No         ---  Switch that indicates if language uses nested comments.
  501. OUT COMMENT: /*,*/ ---  Comment delimiter to be used outputting from ShroudIt!
  502.                         If second parameter is a number (i.e. *,6) then
  503.                         assume COBOL style comments are required.
  504. KEEP COMMENT: $    ---  Use this if you have compiler directives inside
  505.                         comments, and you therefore need to keep the comments.
  506.                         Specify the token within the comment that indicates
  507.                         a compiler directive.  You can have more than one.
  508.  
  509. INCLUDING: #include,<>   --- Special characters that denote including of code.
  510. INCLUDING: #include,""   --- More than one type syntax is supported.
  511. SKIP INCLUDE: <>         --- Do not expand this type of include file. Use this
  512.                              for C code to ignore library includes.
  513.  
  514. REPLACE NUMBS: #define  &&name  [&&numb|&&text] [&&len]
  515.                          --- replace numeric constants with a define instead.
  516.                              Special tokens hold the place of the variable,
  517.                              its number or text value, and optionally its
  518.                              length.  (Languages like Cobol require you to
  519.                              know the length of strings).
  520. REPLACE STRGS: No,       --- Replace string constants with a define instead.
  521. STRING TO HEX: No        --- If set to Yes, then string constants are output
  522.                              as their decimal equivalents.
  523.  
  524. SEED RANDOM: Yes         --- If set to No, then random seed not set, so each
  525.                              run of shrouder will produce exactly the same
  526.                              result.
  527. COMPRESS LINE: Yes,70    --- If Yes, compacts lines together, upto maximum
  528.                              width specified, and strips off leading
  529.                              whitespace.  This may not work for all languages.
  530. COMPRESS OFF: predicates --- Optional keyword, until this line found, do not
  531.                              compress lines. (This is need for Prolog source).
  532. COMPRESS OFF: another        You can have more than one keyword to look for.
  533. COMPRESS SKIP: #define   --- Skips compression on line containing this word.
  534. COMPRESS SKIP: #undef        You can have more than one keyword to look for.
  535. LINE CONTINUE: \         --- If last char on line, then don't compress as this
  536.                              is a continuation.
  537. LINE CONTINUE: \,End     --- As above, but don't start compressing again till
  538.                              one line after end of continuation!
  539.  
  540. REGISTRATION: Company Name  --- Causes comments to be generated with this
  541.                                 detail in them.  Also used to create serial
  542.                                 number (using a string hashing algorithm).
  543. SERIAL NUMBER: L01-,IL-1    --- Text to prefix and suffix the hash number above.
  544. OBSCURE NAMES: Yes      --- Determines if global used names are obscured.
  545. BLOCK TOKENS: {,}       --- When obsuring names that are globally used, you
  546.                             must specify the logical block start and end chars.
  547.                             Also used by the procedure matching logic for the
  548.                             cross-reference map.
  549. FUNCTIONS OFF: main(void) - Optional keyword, until this line found, do not
  550.                             start function mapping.  You may have more than 1.
  551. DEFINE CODE: #define  &&name  &&text [&&len]
  552.                         --- source code syntax for the following defines.
  553. DEFINE GLOBLS: Yes      --- Global names are shrouded with random replacements.
  554. DEFINE KEYWRD: Yes      --- Language key words are shrouded with randoms.
  555. DEFINE REPLACE: }, $_   --- Random (20% chance) replacement of char symbol to
  556.                             confuse beautifier programs when code is compressed.
  557. DEFINE REPLACE: ), x_Rqz    You can have more than one replacement.
  558.  
  559. NAME TOKEN: $           --- PERL style variable naming, provide as many as
  560. NAME TOKEN: &           --- you need, more than one type syntax is supported.
  561.                             ShroudIt! will ONLY obfuscate names prefixed with
  562.                             the token specified.  Also names inside strings
  563.                             will be substituted.  (See Notes above for more).
  564.  
  565. SKIP CODE: EOF,EOF      --- Allows skipping of chunk of source code, based
  566.                             on tokens provided, From token, To token.
  567.                             Designed for PERL die<<EOF
  568.                             ....text...EOF syntax. Will also work for BASIC
  569.                             style DATA statements.
  570. COMMENT DIRC: #!        --- PERL style compiler directives, will also work
  571.                             for other languages that put directives inside
  572.                             comments at the top of the program.
  573.  
  574. Cross-reference Map:
  575. --------------------
  576.  
  577. A obfuscated word map cross-reference is produced, along with line numbers.
  578. This allows you to support your code when users report bugs. You should
  579. NEVER provide your end-users with this map!
  580.  
  581. Always check the MAP to make sure no language key words have been overlooked
  582. from the .KEY parameter file.  (If your compile fails on an undefined word
  583. this is the first thing you should check).
  584.  
  585. The map is organized into three sections:
  586.  
  587.     Program Variables
  588.     Procedures/Functions/Sub-routines
  589.     Externals/Globals
  590.  
  591. The External/Global names are determined from your entries in the .GLB
  592. file.  All other tokens are stored with their line number occurances.
  593.  
  594. Line numbers are listed as is, without any attempt to line wrap them, so
  595. in an editor you will have to scroll right to see the complete list.
  596.  
  597. The line number for source tokens within an include or copybook file are
  598. listed as the line number of the include file within the main source code.
  599.  
  600. If you provide block tokens using the BLOCK TOKENS: parameter, ShroudIt!
  601. will uses these to determine Procedure/Function/Sub-routine boundaries.
  602.  
  603. This capability can be helpful in clarifying the map listing.  However,
  604. because of the inherent differences between languages and coding styles,
  605. leakage can occur, and entries can be transposed between the Program Variable
  606. section.  This is not a symptom of a 'bug', but merely the behaviour of the
  607. method as currently implemented.
  608.  
  609. Future versions will look to improve in this area.  Currently the results
  610. will varying depending on the language and syntax you are using.
  611.  
  612. Generally when debugging using the MAP after shipping your product, you
  613. merely want to search for a token to discover the real source code name.
  614. The value of the separate sections comes mainly when you are doing the
  615. original shrouding, and are cross-checking the results to obtain further
  616. insights into the process.
  617.  
  618. Hint - output in the External/Global variables section can be cut and paste
  619. back into the .GLB file to force substitution of the same obfuscated names
  620. across the complete system.  This saves you having to come up with random
  621. names manually yourself.
  622.  
  623.  
  624. Technical Support:
  625. ------------------
  626.  
  627. ShroudIt! has been designed to encourage you to experiment to find the
  628. best mix of components to match your own source code.  On the other hand
  629. this process should also provide for a minimal number of physical changes
  630. to the source itself.  Obviously in a ten program system, this is not too
  631. contentious, but in a 500 program system it is critical.  This also
  632. applies to pre- or post-processing by say editor macros to facilitate
  633. ShroudIt! translation.  You want to minimize that stuff.
  634.  
  635. Therefore you should carefully work through the user manual, the notes,
  636. and your own inventiveness, but when all else fails you can reach us
  637. through the following:
  638.  
  639. E-Mail:
  640.  
  641.     InterNet    -   drrwebber@acm.org
  642.     Compuserve  -   72030,1547
  643.  
  644. FAX:
  645.  
  646.     (301)-927-7193
  647.  
  648. Telephone:
  649.  
  650.     (301)-97-3223
  651.  
  652. Be aware that all telephone calls are screened to ensure that you have
  653. either tried E-Mail or FAX first, and that licensed customers have
  654. priority on voice contact.
  655.  
  656. You should use E-Mail as your preferred contact, since the turn around
  657. will be MUCH faster.
  658.  
  659. ==============  S h r o u d I t !   U S E R S   G U I D E  ====================
  660.  
  661. A P P E N D I X:
  662. ================
  663.  
  664. Exit Codes and Prolog Errors:
  665.  
  666. If ShroudIt! detects a processing error it will return the following
  667. error levels to the operating system:
  668.  
  669. 10  -   Processing failed, invalid input parameters.
  670. 15  -   Expected file was missing, none fatal error.
  671. 16  -   Expected input file was missing, none fatal error.
  672. 21  -   Processing failed, translation aborted for some reason.
  673. 17  -   Expected include file was missing, none fatal error.
  674. 99  -   Invalid integer value in compression length.
  675.  
  676. You may also experience Prolog errors, 7000 level errors are system
  677. level errors, usually due to missing files, or invalid file i/o.
  678. Here is a sampling of the more common system related errors.  The
  679. first thing to try is to increase the amount of available free memory
  680. available by unloading any unnecessary utility programs.
  681.  
  682. Below is a sampling of common error messages due to system problems.
  683.  
  684. 1001 Gstack overflow. Not enough memory or an endless loop.
  685. 1002 Heap overflow. Not enough memory or an endless loop.
  686. 1008 Memory initialization failure.
  687. This indicates severe shortage of memory. The program is unable
  688. to start execution.
  689. 1010 Stack overflow. Not enough memory or an endless loop.
  690. 1020 Trail overflow. Not enough memory or an endless loop.
  691.  
  692. 1101 Attempt to open an already open file.
  693. 1103 Attempt to assign output device to a file that is not in writemode.
  694. 7003 Path not found
  695. 7005 Access denied
  696. 7008 Insufficient memory
  697. 7019 Disk write-protected
  698. 7021 Drive not ready
  699. 7029 Write fault
  700. 7030 Read fault
  701. 7032 Sharing violation
  702. 7112 Disk is full
  703.  
  704. Legal Terms and Conditions of use:
  705. ==================================
  706.  
  707. ShroudIt! and its related programs are NOT public domain or freeware!
  708. The Shroudit! package is a copyrighted software product developed and
  709. owned by LNK Corporation, Inc, with patent application pending.
  710. This software and accompanying documentation are protected by United
  711. States copyright law and also by international treaty provisions.
  712.  
  713. The ShroudIt! product is provided on a 60 day evaluation.  However to
  714. distribute the obfuscated source code that ShroudIt! produces you MUST
  715. obtain a license agreement from LNK Corporation Inc.
  716.  
  717. Refer to the ORDER form enclosed in the ShroudIt! documentation for
  718. details of the different licenses available.  All payments must be in
  719. U.S. dollars.
  720.  
  721. Upon receipt of your license fee, a signed license agreement for
  722. distribution of products created with ShroudIt! will be sent to you.  In
  723. addition, you will be entitled to technical support and future releases
  724. at a reduced price.
  725.  
  726. You may not use, copy, rent, lease, sell, modify, decompile,
  727. disassemble, otherwise reverse engineer, or transfer the licensed
  728. program except as provided in this agreement.  Any such unauthorized
  729. use shall result in immediate and automatic termination of this license.
  730. All rights not expressly granted here are reserved to LNK Corporation,
  731. Inc.
  732.  
  733. Shareware disk distributors, computer user groups and computer bulletin boards
  734. may distribute the unlicensed version of ShroudIt! without a distribution
  735. license provided the ShroudIt! package is not modified, and a fee not to exceed
  736. $15 is charged for such distribution.
  737.  
  738.  
  739. LIMITED DISTRIBUTION LICENSE
  740.  
  741. The following may distribute ShroudIt!, completely unaltered, without
  742. further permission...; for other cases or to distribute in modified
  743. form, you must consult the attached data record, which is hereby
  744. incorporated by reference.  Any distribution satisfying all the
  745. distribution requirements expressed in that data record is hereby
  746. authorized.
  747.  
  748. Permission to distribute the ShroudIt! package is not transferable,
  749. assignable, saleable, or franchisable.  Each vendor wishing to
  750. distribute the package must independently satisfy the terms of this
  751. limited distribution license.
  752.  
  753. U.S. Government Information:  Use, duplication, or disclosure by the
  754. U.S. Government of the computer software and documentation in this
  755. package shall be subject to the restricted rights applicable to
  756. commercial computer software as set forth in subdivision (b)(3)(ii) of
  757. the Rights in Technical Data and Computer Software clause at
  758. 252.227-7013 (DFARS 52.227-7013).  The Contractor/manufacturer is
  759. LNK Corporation, Inc, Riverdale, Maryland 20737.
  760.  
  761. LNK Corporation, Inc may revoke any permissions granted here, by
  762. notifying you in writing.  All rights not expressly granted here are
  763. reserved to LNK Corporation, Inc.
  764.  
  765.  
  766. Warranty
  767. ========
  768.  
  769. THE SHROUDIT! PRODUCT IS LICENSED "AS IS" WITHOUT ANY WARRANTY OF
  770. MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, PERFORMANCE, OR
  771. OTHERWISE.  ALL WARRANTIES ARE EXPRESSLY DISCLAIMED.  BY USING THE
  772. SHROUDIT! PRODUCT, YOU AGREE THAT NEITHER LNK CORPORATION, INC.  NOR
  773. ANY OFFICERS, DIRECTORS, EMPLOYEES, SHAREHOLDERS, AFFILIATES, OWNERS, OR
  774. OTHER RELATED PARTIES WILL BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY
  775. USE OF (OR INABILITY TO USE) OR PERFORMANCE OF THIS PRODUCT, OR FOR ANY
  776. DAMAGES WHATSOEVER WHETHER BASED ON CONTRACT, TORT OR OTHERWISE EVEN IF
  777. WE ARE NOTIFIED OF SUCH POSSIBILITY IN ADVANCE.  (SOME STATES DO NOT
  778. ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL
  779. DAMAGES, SO THE FOREGOING LIMITATION MAY NOT APPLY TO YOU.)
  780.  
  781. This agreement shall be governed by the laws of the State of Maryland
  782. and shall inure to the benefit of LNK Corporation, Inc. and any
  783. successors, administrators, heirs and assigns. Any action or proceeding
  784. brought by either party against the other arising out of or related to
  785. this agreement shall be brought only in a STATE or FEDERAL COURT of
  786. competent jurisdiction located in Prince George's County, Maryland. The
  787. parties hereby consent to in personam jurisdiction of said courts.
  788.  
  789.  
  790. Ordering Form:
  791.  
  792. ============ License Agreement for ShroudIt! Software use =================
  793.  
  794. This product is provided on a 60 day evaluation.  However to distribute the
  795. obfuscated source code that ShroudIt! produces you MUST obtain a license
  796. agreement from LNK Corporation Inc.
  797.  
  798. Two categories are used for license pricing which are determined on
  799. the following basis:
  800.  
  801. Category A - one time usage for personal or small business use, or any
  802.              use for product distribution as shareware or freeware.
  803.  
  804. Category B - all other commercial uses.
  805.  
  806. Once you are ready to distribute the obfuscated source code, complete
  807. and sign two copies of this form and return it to LNK Corporation, along
  808. with your payment.  Your original will then be signed and returned to
  809. you and LNK will retain the second copy.
  810. --------------------------------- ### -------------------------------------
  811.  
  812. License agreement between _________________________________________ and
  813. LNK Corporation, Inc, of Riverdale, Maryland is for distribution of
  814. Category ___ product(s) as determined above.
  815.  
  816. The license is valid until terminated by either party, and subject to
  817. the laws of the state of Maryland.
  818.  
  819. A license fee of  $ _________ is payable in advance.
  820.  
  821. Category A - $90.00, Category B - $190.00
  822.  
  823.  
  824.  
  825.        Signed by and date _____________________________________________
  826.  
  827.        Name and Title     _____________________________________________
  828.  
  829.        for and on behalf of ___________________________________________
  830.  
  831.                             ___________________________________________
  832.  
  833.                             ___________________________________________
  834.  
  835.  
  836.        Signed by and date _____________________________________________
  837.  
  838.        Name and Title     _____________________________________________
  839.  
  840.        for and on behalf of LNK Corporation, Inc,
  841.                             6811 Kenilworth Avenue,
  842.                             Suite #306,
  843.                             Riverdale, Maryland, 20737.
  844.  
  845. --------------------------------- ### -------------------------------------
  846.